package com.zeng.config;

import com.zeng.dao.BookDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * @author Zqm
 * @Title: MainConfigOfAutowired
 * @ProjectName SpringAnnotationDriven
 * @date 2019/1/17
 *
 * 自动装配：
 *      spring 通过依赖注入（DI），完成对IOC容器中各个组件依赖关系的赋值
 * 1.Autowired 自动注入
 *      1.优先去容器中找对应的组件  找到才赋值
 *      2.如果出现多个相同类型的组件，再将属性名作为组件的id 去容器中查找
 *      3.使用@Qualifier指定组件的id 而不是使用属性名
 *      4.自动装配 默认一定要将属性赋值好
 *      5.@Primary  让Spring进行自动装配的时候  默认使用首选的Bean
 *              也可以继续使用@Qualifier指定所需要的Bean的名字
 *      BookService{
 *          @Autowired
 *          BookDao bookDao
 *      }
 *
 *  2.Spring还支持@Resource和@Inject
 *          @Resource :
 *              可以和@Autowired 一样实现自动装配
 *              默认是按照组件名称进行装配
 *              没有支持@Primary和@Autowired(required=false)
 *          @Inject:
 *              需要导包和Autowired功能一样  少一个required=false
 *          @Autowired:
 *              是Spring 定义的  其余两个是java 规范
 *              脱离spring框架 不支持
 *
 */
@Configuration
@ComponentScan({"com.zeng.controller",
        "com.zeng.service",
        "com.zeng.dao"})
public class MainConfigOfAutowired {

    @Primary
    @Bean("bookDao2")
    public BookDao bookDao(){
        BookDao bookDao=new BookDao();
        bookDao.setLable("2");
        return bookDao;
    }

}
